#!usr/bin/perl -w

################################################################
#				Grupo 06 - 2012 2° Cuatrimestre				   #
#															   #
#        			   Comando Logger.pl 				       #
################################################################

# Forma de uso del script
# Invocacion: $ perl Logger.pl -c=[codigo] -l=[script] [TAG] [OPCIONAL -m=[mensaje]]

# -c=[codigo] : valor numérico que identifica al error. Debe estar 
# registrado en el archivo 'cod_err'

#-l=[script] : nombre del script que invoca al logger

#[TAG] : Puede ser -i, -a, -e, -s.
# -i : Información 
# -a : Alerta
# -e : Error
# -s : Error Severo

#-m=[mensaje] : mensaje clarificador del logueo 
# En casos de Error y Error Severo NO se lo utiliza

$BINDIR= $ENV{BINDIR}; #"./directorios/BINDIR/";	

$LOGCONFIG = "${BINDIR}log.config";
$logdir = $ENV{LOGDIR};
$logsize = 1024000;
$logext = ".log";
$archCodErr = "${BINDIR}cod_err";

$tag = "Default";
$mensaje = "Default";
$lugar = "Default";
$codigo = "Default";
$error="Default";

sub getValorGrep($$){
	# Recibe el nombre del archivo y la clave a buscar con grep
	# Parsea lineas de la forma 'clave=valor'. Devuelve 'valor'
	local @res=split("=",`grep ^$_[1] $_[0]`);
	chomp($res[1]);
	return $res[1];
}


sub logConfig() {# TIENE QUE VOLAR YAA!!!
	# Levanta el archivo de configuración para setear las variables
	# de ambiente
	#$logsize = getValorGrep($LOGCONFIG, "logsize");
	#$logext = getValorGrep($LOGCONFIG, "logext");
	#$logdir = getValorGrep($LOGCONFIG, "logdir");
	#$archCodErr = getValorGrep($LOGCONFIG, "archCodErr");
}


sub timeStamp(){
    # Devuelve una cadena de la forma "dia/mes/año-hora"    
    @mom = localtime();
    local $s = ($mom[5] + 1900) . ($mom[4] + 1);
    if (length($mom[3]) == 1) {
		$s .= "0";
	}
    $s .= $mom[3] . " " . $mom[2] . ":" . $mom[1] . ":" . $mom[0];
    return $s;
}


sub parsear($\$){
# Recibe cadena y una referencia donde guardo lo que esta
# despues del igual
    @values = split('=', $_[0]);
    ${$_[1]} = $values[1];
	
}


sub escribir($$){
	local($s,$f,$ARCH);	
	$f = $_[0]; $s = $_[1];	#$f nombre del archivo, $s msj a escribir
	$f .= $logext;
	#`chmod 0666 $f`;		# Habilita permisos de r y w para todos (y todas)
    open($ARCH, ">>", "${logdir}$f") or die "No puede abrir archivo '$logdir$f': [$!]\n";
    print $ARCH $s;
	close ($ARCH);
}


sub validar(\$){ 
    #valida que el mensaje sea ASCII
    ${$_[0]} =~ s/[^\x00-\x7F]//g;
}


sub mantieneTam($){
	# Recibe $lugar. Si esta excedido de tamanio, lo achica
	local $orig = "${logdir}$_[0]";
	$orig .= $logext;
	local @res = split(" ",`wc -c $orig`);	# obtiene el tam del original
	local $tam = $res[0];
	if ($tam > $logsize) {
		@res = split(" ",`wc -l $orig`); # obtiene la cant de lineas del orig
		local $len = $res[0];
		local $mitad = int($len / 2);	
		`sed '1,$mitad d' <$orig >aux`;	# Borra la mitad de las lineas 
							# del orig y manda las que quedan a aux
		`rm -f $orig`;
		`mv aux $orig`;	
	}
}


sub getArgumentos() {
	foreach (@ARGV) {
		if ($_ =~ /-l=/){
			parsear($_,$lugar);
		}

		elsif ($_ =~ /-c=/){
			parsear($_,$codigo);
		}

		elsif ($_ =~ /-m=/){
			parsear($_,$mensaje);
		}

		elsif ($_ eq "-i"){
			$tag = "INFO";
		}

		elsif ($_ eq "-a"){
			$tag = "ALERTA";
		}

		elsif ($_ eq "-e"){
			$tag = "ERROR";
		}

		elsif ($_ eq "-s"){
			$tag = "ERROR_SEVERO";
		}
	}
}


sub main() {
	#logConfig();
	getArgumentos();
	validar($mensaje);
    local $tiempo = timeStamp();

	if ($tag eq "ERROR" || $tag eq "ERROR_SEVERO"){
		$error = getValorGrep($archCodErr, $codigo);
	} else {
		$error = $mensaje;
	}

	local $user = `whoami`;	# obtiene el usuario del script
	chomp($user);
	
	$cad = "$tiempo-$user-$lugar-$tag-$error\n";
	print $cad;

	escribir($lugar,$cad);
	mantieneTam($lugar);
}


main();

